<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // es6 基础 ---> ECMA2015

        // 对于变量的定义很随意

        // var a;
        // var a;

        // 1. var具有变量提升
        // 2. let、const均不可同一作用域重复定义
        // 3. let、const都有块级作用域
        // 4. const定义常量

        // const a = 1;
        // a = 2;

        // const obj = {
        //     a: 1
        // }
        // obj.a = 2;

        // let {
        //     a = 2
        // } = {
        //     b: 2
        // }

        // let {
        //    obj: {
        //        a
        //    } 
        // } = {
        //     obj: {
        //         a: 1
        //     }
        // }

        // console.log(obj)

        // let obj = {
        //     name: 'renyl'
        // }

        // let obj_1 = {...obj};

        // let obj_1 =- {};

        // obj_1[key] = obj[key]

        // obj_1.name = 'tom'

        // console.log(obj.name)


        // let arr = [1];

        // let brr = arr.concat(2, 3);

        // console.log(brr)


        // function fun() {
        //     function child(...reset) {
        //         console.log(reset)
        //     }
        //     // console.log(Array.from(arguments))
        //     child(...[...arguments])
        // }


        // fun(1, 2, 3, 4, 5)

        // function fun() {

        // }

        // () => {}

        // function a() {
        //     console.log(this)
        // }
        // let obj = {
        //     a:  function() {
        //         console.log(this)
        //     }
        // }

        // a()

        // obj.a()


            // let obj = {
            //     name: 'renyl',
            //     a: function() {
            //         console.log(this)
            //     },
            //     b: (...reset) => {
            //         console.log(this)
            //     }
            // }
            // obj.a();
            // obj.b();


            //    call    apply       bind



            function fun(a, b, c) {
                console.log(a, this, b, c);
                return 2
            }

            // fun.call({}, 1, 2)

            

            // let newFun = fun.bind({}, 1, 2);

            // newFun(3);

            // obj.b.call({})

            function myCall(context) {
                if (typeof this !== 'function') {
                    throw new Error('调用者不是一个函数')
                }
                context = context || window;
                context.fun = this;
                let args = [...arguments].slice(1);
                let res = context.fun(...args);
                delete context.fun
                return res
            }
            Function.prototype.myCall = myCall;
            // let res = fun.myCall({age: 30}, 1, 2, 3);

            // fun.apply({}, [1, 2]);
            function myApply(context) {
                if (typeof this !== 'function') {
                    throw new Error('调用者不是一个函数')
                }
                context = context || window;
                context.fun = this;
                let args = [...arguments][1];
                let res = context.fun(...args);
                delete context.fun
                return res
            }
            Function.prototype.myApply = myApply;
            let res = fun.myApply({age: 30}, [1, 2, 3]);

            console.log(res, 'apply')
    </script>
    

</body>
</html>